package com.wk.job;

import java.util.ArrayList;
import java.util.HashMap;

/***
 * Task记录着从数据库中读取的字段信息。Creater类从数据库读取任务以后封装成该类。放到TaskQueue中
 * @author wkhua
 *
 */
public class Task {
	
	private int taskId;//task对应数据中的id
	private String taskName;//任务名称对应 production_plan_name
	private String product_type;//任务类型 product_type
	private String region_code;//属性编码 region_range
	private boolean isFinished = false;// true：每个Job都有结果（即：finished或failed）
	private boolean isFailed = false;// true：任一Job failed
	private HashMap<String, Job> jobs = null;// 该task分解得到的job。key：job的省份；value：Job本身，不为null
	
	public Task(int taskId, String production_plan_name, String product_type, String region_code){
		this.setTaskId(taskId);
		this.setProduct_type(product_type);
		this.setRegion_code(region_code);
		this.setTaskName(production_plan_name);
		this.jobs = new HashMap<>();//
	}

	/***
	 * 分析task 解析需要创建的Job数目。每个省对应一个job 
	 * 1. 更新task.jobsName字段。所有解析出来的省编号都被加入该list
	 * 2. 生成一个Job并把该Job放入jobsQueue中
	 * 
	 * @param task
	 */
	public ArrayList<Job> generateJobs() {
		ArrayList<Job> newJobs = new ArrayList<>();
		String regionCode = this.getRegion_code();
		String[] regions = regionCode.split(",");
		if (regions.length != 0) {
			String jobProvience = regions[0];
			
			Job job = new Job(this.getProduct_type(), regionCode);// 类型，名字
			job.setJobAddress(jobProvience);
			job.setTaskId(taskId);
			newJobs.add(job);// 增加一个job
			jobs.put(job.getJobProper(), job);
		} else {
			// 查表得到所有的省级编号。
			//TODO 添加多省份支持
		}
		return newJobs;
	}
	public void removeAjob(Job job){
		if (jobs.remove(job.getJobProper()) != null) {
			if (job.isFailed()) {
				isFailed = true;
			}

			if (jobs.size() == 0) {
				isFinished = true;
			} else {
				isFinished = false;
			}
		}
	}
	/***
	 * 设置当前Task状态
	 * 外界只能把未完成的Task设置成完成状态。
	 * @param isTrue 
	 * @return 设置成功返回true，否则返回false;
	 */
	public boolean setState(boolean isTrue){
		if(!isFinished){
			isFinished = isTrue;
			return true;
		}
		return false;
	}
	
	public boolean  isFinished() {
		return isFinished;
	}
	
	public boolean isFailed(){
		return isFailed;
	}
	
	public int countRemainingJobs() {
		return jobs.size();
	}
	
	/***
	 * 返回jobs中的所有省级元素，把 jobs中所有元素都用逗号隔开
	 * 
	 * @return
	 */
	public String getJobsName(){
		StringBuffer jobsNameBuffer = new StringBuffer();
		int size = jobs.size();
		for(Job job: jobs.values()){
			if(size!=0){
				jobsNameBuffer.append(job.getJobName()+",");
			}else{
				jobsNameBuffer.append(job.getJobName());	
			}
			size--;
		}
		return jobsNameBuffer.toString();
	}
	
	public String getProduct_type() {
		return product_type;
	}

	public void setProduct_type(String product_type) {
		this.product_type = product_type;
	}

	public String getRegion_code() {
		return region_code;
	}

	public void setRegion_code(String region_code) {
		this.region_code = region_code;
	}

	public String getTaskName() {
		return taskName;
	}

	public void setTaskName(String production_plan_name) {
		this.taskName = production_plan_name;
	}

	public int getTaskId() {
		return taskId;
	}

	public void setTaskId(int taskId) {
		this.taskId = taskId;
	}

	@Override
	public String toString() {
		return "Task [taskId=" + taskId + ", taskName=" + taskName + ", product_type=" + product_type + ", region_code="
				+ region_code + ", isFinish=" + isFinished + ", jobs=" + jobs.size() + "]";
	}
	
}
